
<!doctype html>
<html lang="en" class="no-js">
  <head>
    
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width,initial-scale=1">
      
      
      
      <link rel="icon" href="../../../../static/images/favicon.png">
      <meta name="generator" content="mkdocs-1.3.0, mkdocs-material-8.2.8">
    
    
      
        <title>使用 acme.sh 自动签发续期 Let's encrypt Free 证书 - WL4G DOCS</title>
      
    
    
      <link rel="stylesheet" href="../../../../assets/stylesheets/main.644de097.min.css">
      
        
        <link rel="stylesheet" href="../../../../assets/stylesheets/palette.e6a45f82.min.css">
        
      
    
    
    
      
        
        
        <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
        <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
        <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
      
    
    
      <link rel="stylesheet" href="../../../../static/css/util.css">
    
    <script>__md_scope=new URL("../../../..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
    
      

    
    
  </head>
  
  
    
    
      
    
    
    
    
    <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="" data-md-color-accent="">
  
    
    
      <script>var palette=__md_get("__palette");if(palette&&"object"==typeof palette.color)for(var key of Object.keys(palette.color))document.body.setAttribute("data-md-color-"+key,palette.color[key])</script>
    
    <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
    <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
    <label class="md-overlay" for="__drawer"></label>
    <div data-md-component="skip">
      
        
        <a href="#acmesh-lets-encrypt-free" class="md-skip">
          Skip to content
        </a>
      
    </div>
    <div data-md-component="announce">
      
    </div>
    
      <div data-md-component="outdated" hidden>
        <aside class="md-banner md-banner--warning">
          
        </aside>
      </div>
    
    
      

<header class="md-header" data-md-component="header">
  <nav class="md-header__inner md-grid" aria-label="Header">
    <a href="../../../.." title="WL4G DOCS" class="md-header__button md-logo" aria-label="WL4G DOCS" data-md-component="logo">
      
  <img src="../../../../static/images/mylogo.jpeg" alt="logo">

    </a>
    <label class="md-header__button md-icon" for="__drawer">
      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
    </label>
    <div class="md-header__title" data-md-component="header-title">
      <div class="md-header__ellipsis">
        <div class="md-header__topic">
          <span class="md-ellipsis">
            WL4G DOCS
          </span>
        </div>
        <div class="md-header__topic" data-md-component="header-topic">
          <span class="md-ellipsis">
            
              使用 acme.sh 自动签发续期 Let's encrypt Free 证书
            
          </span>
        </div>
      </div>
    </div>
    
      <form class="md-header__option" data-md-component="palette">
        
          
          
          <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="" data-md-color-accent=""  aria-label="Switch to dark mode"  type="radio" name="__palette" id="__palette_1">
          
            <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 6H7c-3.31 0-6 2.69-6 6s2.69 6 6 6h10c3.31 0 6-2.69 6-6s-2.69-6-6-6zm0 10H7c-2.21 0-4-1.79-4-4s1.79-4 4-4h10c2.21 0 4 1.79 4 4s-1.79 4-4 4zM7 9c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></svg>
            </label>
          
        
          
          
          <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="" data-md-color-accent=""  aria-label="Switch to light mode"  type="radio" name="__palette" id="__palette_2">
          
            <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3z"/></svg>
            </label>
          
        
      </form>
    
    
      <div class="md-header__option">
        <div class="md-select">
          
          <button class="md-header__button md-icon" aria-label="Select language">
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.52 17.52 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04M18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12m-2.62 7 1.62-4.33L19.12 17h-3.24z"/></svg>
          </button>
          <div class="md-select__inner">
            <ul class="md-select__list">
              
                <li class="md-select__item">
                  <a href="/en/" hreflang="en" class="md-select__link">
                    English
                  </a>
                </li>
                
                <li class="md-select__item">
                  <a href="/zh/" hreflang="zh" class="md-select__link">
                    简体中文
                  </a>
                </li>
                
            </ul>
          </div>
        </div>
      </div>
    
    
      <label class="md-header__button md-icon" for="__search">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
      </label>
      <div class="md-search" data-md-component="search" role="dialog">
  <label class="md-search__overlay" for="__search"></label>
  <div class="md-search__inner" role="search">
    <form class="md-search__form" name="search">
      <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
      <label class="md-search__icon md-icon" for="__search">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
      </label>
      <nav class="md-search__options" aria-label="Search">
        
        <button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
        </button>
      </nav>
      
        <div class="md-search__suggest" data-md-component="search-suggest"></div>
      
    </form>
    <div class="md-search__output">
      <div class="md-search__scrollwrap" data-md-scrollfix>
        <div class="md-search-result" data-md-component="search-result">
          <div class="md-search-result__meta">
            Initializing search
          </div>
          <ol class="md-search-result__list"></ol>
        </div>
      </div>
    </div>
  </div>
</div>
    
    
  </nav>
  
</header>
    
    <div class="md-container" data-md-component="container">
      
      
        
          
            
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
  <div class="md-tabs__inner md-grid">
    <ul class="md-tabs__list">
      
        
  
  


  
  
  
    <li class="md-tabs__item">
      <a href="../../../.." class="md-tabs__link">
        Getting Started
      </a>
    </li>
  

      
    </ul>
  </div>
</nav>
          
        
      
      <main class="md-main" data-md-component="main">
        <div class="md-main__inner md-grid">
          
            
              
              <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
                <div class="md-sidebar__scrollwrap">
                  <div class="md-sidebar__inner">
                    

  


  

<nav class="md-nav md-nav--primary md-nav--lifted md-nav--integrated" aria-label="Navigation" data-md-level="0">
  <label class="md-nav__title" for="__drawer">
    <a href="../../../.." title="WL4G DOCS" class="md-nav__button md-logo" aria-label="WL4G DOCS" data-md-component="logo">
      
  <img src="../../../../static/images/mylogo.jpeg" alt="logo">

    </a>
    WL4G DOCS
  </label>
  
  <ul class="md-nav__list" data-md-scrollfix>
    
      
      
      

  
  
  
    
    <li class="md-nav__item md-nav__item--nested">
      
      
        <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_1" data-md-state="indeterminate" type="checkbox" id="__nav_1" checked>
      
      
      
      
        <label class="md-nav__link" for="__nav_1">
          Getting Started
          <span class="md-nav__icon md-icon"></span>
        </label>
      
      <nav class="md-nav" aria-label="Getting Started" data-md-level="1">
        <label class="md-nav__title" for="__nav_1">
          <span class="md-nav__icon md-icon"></span>
          Getting Started
        </label>
        <ul class="md-nav__list" data-md-scrollfix>
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../../.." class="md-nav__link">
        Introduction
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../../../ABOUT_CN/" class="md-nav__link">
        About
      </a>
    </li>
  

            
          
        </ul>
      </nav>
    </li>
  

    
  </ul>
</nav>
                  </div>
                </div>
              </div>
            
            
          
          <div class="md-content" data-md-component="content">
            <article class="md-content__inner md-typeset">
              
                


<h1 id="acmesh-lets-encrypt-free">使用 acme.sh 自动签发续期 Let's encrypt Free 证书<a class="headerlink" href="#acmesh-lets-encrypt-free" title="Permanent link">&para;</a></h1>
<h2 id="_1">前言<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h2>
<p>之前看过一些教程快速撸一个免费HTTPS证书的文章，是通过 Certbot 来管理 Let's Encrypt 的证书，使用前需要安装一堆库，觉得不太友好。所谓条条大路通罗马，肯定还有其他方法可以做这个事情。</p>
<p>通过 Let’s encrypt 可以获得 90 天免费且可续期的 SSL 证书，而利用 <a href="https://github.com/acmesh-official/acme.sh">acme.sh</a> 这个库可以自动生成和更新，它是用Shell脚本编写的，不需要安装其他东西，比较纯净值得一试，如下就以参考官方及民间文档整合了一下具体的配置过程。</p>
<h2 id="1">1. 准备<a class="headerlink" href="#1" title="Permanent link">&para;</a></h2>
<ul>
<li>一个已备案已解析的域名（以用来支持 http 访问）</li>
<li>开启服务器的 80/443 端口防火墙。</li>
</ul>
<h2 id="2-acmesh">2. 安装 acme.sh<a class="headerlink" href="#2-acmesh" title="Permanent link">&para;</a></h2>
<ul>
<li>
<p>https://github.com/acmesh-official/acme.sh</p>
</li>
<li>
<p>在线安装</p>
</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1"></a><a href="#__codelineno-0-1"><span class="linenos" data-linenos="1 "></span></a>curl -L https://get.acme.sh <span class="p">|</span> sh
</code></pre></div>
<ul>
<li>执行如上命令，会做这些操作：</li>
<li>从 GitHub 上下载 sh 脚本并执行；</li>
<li>解压文件到 <code>${HOME}/.acme.sh</code> 目录下；</li>
<li>给命令行设置一个 acme.sh 的 alias 别名；</li>
<li>最后注册一个 cron 定时任务来自动更新证书（可 <code>crontab -l</code> 查看）；</li>
<li>
<p>安装完成后要自行重启命令行，或者重新加载一下 <code>. ~/.bashrc</code> 文件；</p>
</li>
<li>
<p>检查生效</p>
</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1"></a><a href="#__codelineno-1-1"><span class="linenos" data-linenos=" 1 "></span></a>acme.sh -h
<a id="__codelineno-1-2" name="__codelineno-1-2"></a><a href="#__codelineno-1-2"><span class="linenos" data-linenos=" 2 "></span></a>https://github.com/acmesh-official/acme.sh
<a id="__codelineno-1-3" name="__codelineno-1-3"></a><a href="#__codelineno-1-3"><span class="linenos" data-linenos=" 3 "></span></a>v3.0.5
<a id="__codelineno-1-4" name="__codelineno-1-4"></a><a href="#__codelineno-1-4"><span class="linenos" data-linenos=" 4 "></span></a>Usage: acme.sh &lt;command&gt; ... <span class="o">[</span>parameters ...<span class="o">]</span>
<a id="__codelineno-1-5" name="__codelineno-1-5"></a><a href="#__codelineno-1-5"><span class="linenos" data-linenos=" 5 "></span></a>Commands:
<a id="__codelineno-1-6" name="__codelineno-1-6"></a><a href="#__codelineno-1-6"><span class="linenos" data-linenos=" 6 "></span></a>  -h, --help               Show this <span class="nb">help</span> message.
<a id="__codelineno-1-7" name="__codelineno-1-7"></a><a href="#__codelineno-1-7"><span class="linenos" data-linenos=" 7 "></span></a>  -v, --version            Show version info.
<a id="__codelineno-1-8" name="__codelineno-1-8"></a><a href="#__codelineno-1-8"><span class="linenos" data-linenos=" 8 "></span></a>  --install                Install acme.sh to your system.
<a id="__codelineno-1-9" name="__codelineno-1-9"></a><a href="#__codelineno-1-9"><span class="linenos" data-linenos=" 9 "></span></a>  --uninstall              Uninstall acme.sh, and uninstall the cron job.
<a id="__codelineno-1-10" name="__codelineno-1-10"></a><a href="#__codelineno-1-10"><span class="linenos" data-linenos="10 "></span></a>...
</code></pre></div>
<h2 id="3">3. 签发证书<a class="headerlink" href="#3" title="Permanent link">&para;</a></h2>
<p>签发 SSL 证书需要证明这个域名是属于你的，即域名所有权，一般有两种方式验证：HTTP 和 DNS 验证。</p>
<p>通过 acme.sh 可以签发单域名、多域名、泛域名证书，还可以签发 ECC 证书。为了简单起见，这里以单域名证书为例，后面再拓展一下好了。</p>
<p>采用如下任意一种方式只要签发安装成功就行！</p>
<h3 id="31-http">3.1 HTTP 验证<a class="headerlink" href="#31-http" title="Permanent link">&para;</a></h3>
<p>这种方式 acme.sh 会自动在你的网站根目录下放置一个文件，来验证你的域名所有权，验证之后就签发证书，最后会自动删除验证文件。</p>
<p>前提是要绑定的域名已经绑定到了所在服务器上，且可以通过公网进行访问！</p>
<ul>
<li>3.1.1 Webroot mode</li>
</ul>
<p>假设服务器在运行着的，网站域名为 example.com，根目录为 /home/wwwroot/example.com。那么只需要执行下面这条语句就行。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1"></a><a href="#__codelineno-2-1"><span class="linenos" data-linenos="1 "></span></a>acme.sh  --issue  -d example.com  -w /home/wwwroot/example.com
</code></pre></div>
<ul>
<li>3.1.2 Apache / Nginx mode</li>
</ul>
<p>如果用的是 Apache 或者 Nginx 服务器，可以自动寻找配置文件来进行签发。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1"></a><a href="#__codelineno-3-1"><span class="linenos" data-linenos="1 "></span></a>acme.sh  --issue  -d example.com  --apache --debug  <span class="m">2</span>  <span class="c1"># Apache</span>
<a id="__codelineno-3-2" name="__codelineno-3-2"></a><a href="#__codelineno-3-2"><span class="linenos" data-linenos="2 "></span></a>acme.sh  --issue  -d example.com  --nginx --debug  <span class="m">2</span>   <span class="c1"># Nginx</span>
</code></pre></div>
<p>如果找不到配置文件的话可以自行配置。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1"></a><a href="#__codelineno-4-1"><span class="linenos" data-linenos="1 "></span></a>acme.sh  --issue  -d example.com  --nginx /etc/nginx/nginx.conf --debug  <span class="m">2</span>  <span class="c1"># 指定nginx的conf</span>
<a id="__codelineno-4-2" name="__codelineno-4-2"></a><a href="#__codelineno-4-2"><span class="linenos" data-linenos="2 "></span></a>acme.sh  --issue  -d example.com  --nginx /etc/nginx/conf.d/example.com.conf --debug  <span class="m">2</span>  <span class="c1"># 指定网站的conf</span>
</code></pre></div>
<ul>
<li>
<p>3.1.3 Standalone mode</p>
</li>
<li>
<p>https://github.com/acmesh-official/acme.sh#4-use-standalone-server-to-issue-cert</p>
</li>
</ul>
<p>这种方式下，acme.sh 会自己建立一个服务器来完成签发。主要适合的是没有建立服务器的情况，不过其实有服务器的话只要暂时关闭，不造成端口冲突就能使用。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1"></a><a href="#__codelineno-5-1"><span class="linenos" data-linenos="1 "></span></a><span class="c1"># 监听 http server</span>
<a id="__codelineno-5-2" name="__codelineno-5-2"></a><a href="#__codelineno-5-2"><span class="linenos" data-linenos="2 "></span></a>acme.sh  --issue  -d example.com  --standalone --debug  <span class="m">2</span>
</code></pre></div>
<p>如果用了反代理后不是 80 端口，也可手动指定。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1"></a><a href="#__codelineno-6-1"><span class="linenos" data-linenos="1 "></span></a>acme.sh  --issue  -d example.com  --standalone --httpport <span class="m">88</span> --debug  <span class="m">2</span>
</code></pre></div>
<p>当然它还支持 tls 模式，非 443 端口的话也可以自行指定。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1"></a><a href="#__codelineno-7-1"><span class="linenos" data-linenos="1 "></span></a>acme.sh  --issue  -d example.com  --alpn
<a id="__codelineno-7-2" name="__codelineno-7-2"></a><a href="#__codelineno-7-2"><span class="linenos" data-linenos="2 "></span></a>acme.sh  --issue  -d example.com  --alpn --tlsport <span class="m">8443</span>  <span class="c1"># 自行指定tls端口</span>
</code></pre></div>
<h3 id="32-dns">3.2 DNS 验证<a class="headerlink" href="#32-dns" title="Permanent link">&para;</a></h3>
<ul>
<li>https://github.com/acmesh-official/acme.sh#8-automatic-dns-api-integration</li>
</ul>
<p>这种方式下，不需要任何服务器及任何公网 ip，只需要 DNS 的解析记录即可完成验证，
比如当服务器不能直接公网访问，以及某些 VPS 直接绑定域名没备案的话是上不去的，就需要采用这种方案了，
当然，手里有域名只是想生成一个证书而已也可以这么用。</p>
<ul>
<li>3.2.1 DNS API mode</li>
</ul>
<p>这种方式贼强大，直接可以利用域名服务商提供的 API 就可以自动帮你添加 TXT 记录完成验证和证书签发。而且60天后还可以自动完成续期，可以爽歪歪。</p>
<p>比如说 CloudFlare 的，在这里获取你的API Key。可以用全局 API Key，将参数导入到命令行。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1"></a><a href="#__codelineno-8-1"><span class="linenos" data-linenos="1 "></span></a><span class="nb">export</span> <span class="nv">CF_Token</span><span class="o">=</span><span class="s2">&quot;xxxxx&quot;</span>
<a id="__codelineno-8-2" name="__codelineno-8-2"></a><a href="#__codelineno-8-2"><span class="linenos" data-linenos="2 "></span></a><span class="nb">export</span> <span class="nv">CF_Account_ID</span><span class="o">=</span><span class="s2">&quot;xxx&quot;</span>
</code></pre></div>
<p>为了限制权限，可以新建一个区域的 API Key. 这里只需要 Zone.DNS 的编辑权限（restrict the API Token only for write access to Zone.DNS for a single domain）就行。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-9-1" name="__codelineno-9-1"></a><a href="#__codelineno-9-1"><span class="linenos" data-linenos="1 "></span></a><span class="nb">export</span> <span class="nv">CF_Token</span><span class="o">=</span><span class="s2">&quot;xxxxx&quot;</span>
<a id="__codelineno-9-2" name="__codelineno-9-2"></a><a href="#__codelineno-9-2"><span class="linenos" data-linenos="2 "></span></a><span class="nb">export</span> <span class="nv">CF_Account_ID</span><span class="o">=</span><span class="s2">&quot;xxx&quot;</span>
<a id="__codelineno-9-3" name="__codelineno-9-3"></a><a href="#__codelineno-9-3"><span class="linenos" data-linenos="3 "></span></a><span class="nb">export</span> <span class="nv">CF_Zone_ID</span><span class="o">=</span><span class="s2">&quot;xxx&quot;</span>
</code></pre></div>
<p>Account_ID 和 Zone_ID 在域名的管理页面右下方可以得到，而后再签发证书。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-10-1" name="__codelineno-10-1"></a><a href="#__codelineno-10-1"><span class="linenos" data-linenos="1 "></span></a>acme.sh --issue --dns dns_cf -d example.com
</code></pre></div>
<p>之后这些配置信息会保存到 <code>~/.acme.sh/account.conf</code> 这个文件里，在证书续期或者其他利用 CF 进行验证的时候会自动调用。</p>
<p>当然，比如国内一般用的是 DNSPod / AliDNS 等也提供了 API，类似配置就好了，如下以 AliDNS 为例，<font color=red>注：如果是RAM子用户，则一定要设置权限如 AliyunDNSFullAccess</font>。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-11-1" name="__codelineno-11-1"></a><a href="#__codelineno-11-1"><span class="linenos" data-linenos="1 "></span></a><span class="nb">export</span> <span class="nv">Ali_Key</span><span class="o">=</span><span class="s2">&quot;xxx&quot;</span>
<a id="__codelineno-11-2" name="__codelineno-11-2"></a><a href="#__codelineno-11-2"><span class="linenos" data-linenos="2 "></span></a><span class="nb">export</span> <span class="nv">Ali_Secret</span><span class="o">=</span><span class="s2">&quot;xxxx&quot;</span>
<a id="__codelineno-11-3" name="__codelineno-11-3"></a><a href="#__codelineno-11-3"><span class="linenos" data-linenos="3 "></span></a>acme.sh --issue --dns dns_ali -d example.com -d www.example.com --debug  <span class="m">2</span>
</code></pre></div>
<p>大约几分钟之后看到如下日志，就表示签发成功了。
  （当然此过程中你也能在 https://dns.console.aliyun.com/#/dns/setting/example.com 看到，被创建了2条TXT记录，之后又被自动删除）</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-12-1" name="__codelineno-12-1"></a><a href="#__codelineno-12-1"><span class="linenos" data-linenos="1 "></span></a>....
<a id="__codelineno-12-2" name="__codelineno-12-2"></a><a href="#__codelineno-12-2"><span class="linenos" data-linenos="2 "></span></a>[Thu Jun 23 19:29:01 CST 2022] Your cert is in: /root/.acme.sh/example.com/example.com.cer
<a id="__codelineno-12-3" name="__codelineno-12-3"></a><a href="#__codelineno-12-3"><span class="linenos" data-linenos="3 "></span></a>[Thu Jun 23 19:29:01 CST 2022] Your cert key is in: /root/.acme.sh/example.com/example.com.key
<a id="__codelineno-12-4" name="__codelineno-12-4"></a><a href="#__codelineno-12-4"><span class="linenos" data-linenos="4 "></span></a>[Thu Jun 23 19:29:01 CST 2022] The intermediate CA cert is in: /root/.acme.sh/example.com/ca.cer
<a id="__codelineno-12-5" name="__codelineno-12-5"></a><a href="#__codelineno-12-5"><span class="linenos" data-linenos="5 "></span></a>[Thu Jun 23 19:29:01 CST 2022] And the full chain certs is there: /root/.acme.sh/example.com/fullchain.cer
<a id="__codelineno-12-6" name="__codelineno-12-6"></a><a href="#__codelineno-12-6"><span class="linenos" data-linenos="6 "></span></a>[Thu Jun 23 19:29:01 CST 2022] _on_issue_success
</code></pre></div>
<ul>
<li>
<p>3.2.2 DNS Manual mode</p>
</li>
<li>
<p>https://github.com/acmesh-official/acme.sh/tree/3.0.4#9-use-dns-manual-mode</p>
</li>
</ul>
<p>适合域名服务商没有提供 API 的情况，需要自己在域名配置一个 TXT 记录，且不能自动续期，每次都需要重新配置。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-13-1" name="__codelineno-13-1"></a><a href="#__codelineno-13-1"><span class="linenos" data-linenos="1 "></span></a>acme.sh  --issue  -d example.com  --dns  -d www.example.com --debug  <span class="m">2</span>
</code></pre></div>
<ul>
<li>
<p>3.2.3 DNS Alias mode</p>
</li>
<li>
<p>https://github.com/acmesh-official/acme.sh/wiki/DNS-alias-mode</p>
</li>
</ul>
<p>如果域名服务商没有提供 API，或者是一个挺重要的域名，为了安全不希望或者不方便直接配置这个域名的解析记录，可以通过另一个没那么重要的域名（可能是专门用来签发证书的）间接进行配置。
实际上还是需要有一个域名来验证所有权。</p>
<h3 id="33">3.3 多域名配置<a class="headerlink" href="#33" title="Permanent link">&para;</a></h3>
<p>多个域名签发同一张证书。只需要在验证方式之后添加多个 <code>-d &lt;you_domain&gt;</code> 参数即可。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-14-1" name="__codelineno-14-1"></a><a href="#__codelineno-14-1"><span class="linenos" data-linenos="1 "></span></a>acme.sh --issue -d example.com -w /home/wwwroot/example.com -d www.example.com --debug  <span class="m">2</span>
<a id="__codelineno-14-2" name="__codelineno-14-2"></a><a href="#__codelineno-14-2"><span class="linenos" data-linenos="2 "></span></a>acme.sh  --issue  -d example.com  --standalone  -d www.example.com --debug  <span class="m">2</span>
<a id="__codelineno-14-3" name="__codelineno-14-3"></a><a href="#__codelineno-14-3"><span class="linenos" data-linenos="3 "></span></a>acme.sh  --issue  -d example.com  --dns  -d www.example.com --debug  <span class="m">2</span>
</code></pre></div>
<p>也可以多个域名指定不同的验证方式，例如</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-15-1" name="__codelineno-15-1"></a><a href="#__codelineno-15-1"><span class="linenos" data-linenos="1 "></span></a>acme.sh  --issue  <span class="se">\</span>
<a id="__codelineno-15-2" name="__codelineno-15-2"></a><a href="#__codelineno-15-2"><span class="linenos" data-linenos="2 "></span></a>-d aa.com  -w /home/wwwroot/aa.com <span class="se">\</span>
<a id="__codelineno-15-3" name="__codelineno-15-3"></a><a href="#__codelineno-15-3"><span class="linenos" data-linenos="3 "></span></a>-d bb.com  --dns dns_cf <span class="se">\</span>
<a id="__codelineno-15-4" name="__codelineno-15-4"></a><a href="#__codelineno-15-4"><span class="linenos" data-linenos="4 "></span></a>-d cc.com  --apache <span class="se">\</span>
<a id="__codelineno-15-5" name="__codelineno-15-5"></a><a href="#__codelineno-15-5"><span class="linenos" data-linenos="5 "></span></a>-d dd.com  -w /home/wwwroot/dd.com --debug  <span class="m">2</span>
</code></pre></div>
<h3 id="34">3.4 泛域名配置<a class="headerlink" href="#34" title="Permanent link">&para;</a></h3>
<p>Wildcard certificates，同理，只需要加个 <code>*</code> 就好。但似乎只适用于 DNS 验证的方式。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-16-1" name="__codelineno-16-1"></a><a href="#__codelineno-16-1"><span class="linenos" data-linenos="1 "></span></a>acme.sh  --issue -d example.com  -d <span class="s1">&#39;*.example.com&#39;</span>  --dns dns_cf --debug  <span class="m">2</span>
</code></pre></div>
<h3 id="35-ecc">3.5 签发 ECC 证书<a class="headerlink" href="#35-ecc" title="Permanent link">&para;</a></h3>
<ul>
<li>https://github.com/acmesh-official/acme.sh#single-domain-ecc-certificate</li>
</ul>
<p>默认签发的都是基于 RSA 密钥加密的证书，而 ECC (Elliptic Curve Cryptography, 椭圆曲线密码) 密钥的保密性比 RSA 更好，密钥长度更短，更能对抗量子解密等，目前现代的操作系统和浏览器都支持 ECC 证书了（Windows XP 及其之前的就算了）。</p>
<p>Let's Encrypt 提供了 ECDSA 证书的签发，且 acme.sh 也支持。
其实只需要加上一个以 <code>ec-</code> 为前缀的 <code>--keylength (-k)</code> 参数即可。理论上上面的各种验证方式都适用。</p>
<ul>
<li>单域名</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-17-1" name="__codelineno-17-1"></a><a href="#__codelineno-17-1"><span class="linenos" data-linenos="1 "></span></a>acme.sh --issue -w /home/wwwroot/example.com -d example.com --keylength ec-256 --debug  <span class="m">2</span>
<a id="__codelineno-17-2" name="__codelineno-17-2"></a><a href="#__codelineno-17-2"><span class="linenos" data-linenos="2 "></span></a>acme.sh --issue -w /home/wwwroot/example.com -d example.com -d www.example.com --keylength ec-256 --debug  <span class="m">2</span>
</code></pre></div>
<ul>
<li>多域名</li>
</ul>
<p>支持以下长度的证书，一般就用 ec-256 就行了。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-18-1" name="__codelineno-18-1"></a><a href="#__codelineno-18-1"><span class="linenos" data-linenos="1 "></span></a>ec-256 (prime256v1, “ECDSA P-256”)
<a id="__codelineno-18-2" name="__codelineno-18-2"></a><a href="#__codelineno-18-2"><span class="linenos" data-linenos="2 "></span></a>ec-384 (secp384r1, “ECDSA P-384”)
<a id="__codelineno-18-3" name="__codelineno-18-3"></a><a href="#__codelineno-18-3"><span class="linenos" data-linenos="3 "></span></a>ec-521 (secp521r1, “ECDSA P-521”, which is not supported by Let’s Encrypt yet.)
</code></pre></div>
<h3 id="36-copy">3.6 安装(copy)证书<a class="headerlink" href="#36-copy" title="Permanent link">&para;</a></h3>
<p>签发证书成功后，需要把证书安装或者复制到真正需要的地方，如 nginx / apache 的目录下。</p>
<p>官方说必须用下面的命令来安装证书，不能直接用 <code>~/.acme.sh/</code> 目录下的证书文件，因为那只能内部使用，且未来目录结构可能会更改。</p>
<p>我们只需要使用 <code>--install-cert</code> 命令，指定目标位置，然后证书文件就会被 copy 到相应的位置了。</p>
<p>其中域名是必须的，其他参数是可选的。</p>
<ul>
<li>3.6.1 Nginx</li>
</ul>
<p>比如你可以在 nginx 的目录下新建一个 cert.d 目录，然后把证书安装 copy 过去。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-19-1" name="__codelineno-19-1"></a><a href="#__codelineno-19-1"><span class="linenos" data-linenos="1 "></span></a>acme.sh --install-cert -d example.com <span class="se">\</span>
<a id="__codelineno-19-2" name="__codelineno-19-2"></a><a href="#__codelineno-19-2"><span class="linenos" data-linenos="2 "></span></a>--key-file   /etc/nginx/cert.d/example.com.key <span class="se">\</span>
<a id="__codelineno-19-3" name="__codelineno-19-3"></a><a href="#__codelineno-19-3"><span class="linenos" data-linenos="3 "></span></a>--fullchain-file /etc/nginx/cert.d/example.com.fullchain.cer <span class="se">\</span>
<a id="__codelineno-19-4" name="__codelineno-19-4"></a><a href="#__codelineno-19-4"><span class="linenos" data-linenos="4 "></span></a>--reloadcmd  <span class="s2">&quot;service nginx force-reload&quot;</span> --debug  <span class="m">2</span>
</code></pre></div>
<p>这里用的是 <code>nginx force-reload</code>, 不是 <code>nginx reload</code>, 据测试发现因为后者并不会重新加载证书。
Nginx 配置 ssl_certificate 使用 <code>/etc/nginx/cert.d/fullchain.cer</code>，而非 <code>/etc/nginx/cert.d/example.cer</code>，否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。</p>
<ul>
<li>2.6.2 Apache</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-20-1" name="__codelineno-20-1"></a><a href="#__codelineno-20-1"><span class="linenos" data-linenos="1 "></span></a>acme.sh --install-cert -d example.com <span class="se">\</span>
<a id="__codelineno-20-2" name="__codelineno-20-2"></a><a href="#__codelineno-20-2"><span class="linenos" data-linenos="2 "></span></a>--cert-file      /path/to/certfile/in/apache/cert.pem  <span class="se">\</span>
<a id="__codelineno-20-3" name="__codelineno-20-3"></a><a href="#__codelineno-20-3"><span class="linenos" data-linenos="3 "></span></a>--key-file       /path/to/keyfile/in/apache/key.pem  <span class="se">\</span>
<a id="__codelineno-20-4" name="__codelineno-20-4"></a><a href="#__codelineno-20-4"><span class="linenos" data-linenos="4 "></span></a>--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem <span class="se">\</span>
<a id="__codelineno-20-5" name="__codelineno-20-5"></a><a href="#__codelineno-20-5"><span class="linenos" data-linenos="5 "></span></a>--reloadcmd     <span class="s2">&quot;service apache2 force-reload&quot;</span> --debug  <span class="m">2</span>
</code></pre></div>
<p>在命令中的 reloadcmd 参数很重要！ 这个用来指定证书更新（Renew）后执行的命令，从而使续期后的证书生效。</p>
<p>默认 60 天就会续期一次，上面这些参数会记录下来并自动执行。非常方便</p>
<h2 id="4-dhparampem">4. 生成 dhparam.pem 文件（可选）<a class="headerlink" href="#4-dhparampem" title="Permanent link">&para;</a></h2>
<div class="highlight"><pre><span></span><code><a id="__codelineno-21-1" name="__codelineno-21-1"></a><a href="#__codelineno-21-1"><span class="linenos" data-linenos="1 "></span></a>openssl dhparam -out /etc/nginx/cert.d/dhparam.pem <span class="m">2048</span>
</code></pre></div>
<p>这一步是为了增强 SSL 的安全性。这里生成一个更强壮的 DHE 参数。</p>
<p>前向安全性（Forward Secrecy）的概念很简单：客户端和服务器协商一个永不重用的密钥，并在会话结束时销毁它。服务器上的 RSA 私钥用于客户端和服务器之间的 Diffie-Hellman 密钥交换签名。从 Diffie-Hellman 握手中获取的预主密钥会用于之后的编码。因为预主密钥是特定于客户端和服务器之间建立的某个连接，并且只用在一个限定的时间内，所以称作短暂模式（Ephemeral）。</p>
<p>使用了前向安全性，如果一个攻击者取得了一个服务器的私钥，他是不能解码之前的通讯信息的。这个私钥仅用于 Diffie Hellman 握手签名，并不会泄露预主密钥。Diffie Hellman 算法会确保预主密钥绝不会离开客户端和服务器，而且不能被中间人攻击所拦截。</p>
<p>nginx 依赖于 OpenSSL 给 Diffie-Hellman （DH）的输入参数。不幸的是，这意味着 Diffie-Hellman Ephemeral（DHE）将使用 OpenSSL 的默认设置，包括一个用于密钥交换的1024位密钥。因为我们正在使用2048位证书，DHE 客户端就会使用一个要比非 DHE 客户端更弱的密钥交换。
更多参考这里 Guide to Deploying Diffie-Hellman for TLS 吧。</p>
<h2 id="5-nginx">5. 配置 Nginx<a class="headerlink" href="#5-nginx" title="Permanent link">&para;</a></h2>
<p>修改网站的 conf 配置文件，加入 SSL 的相关配置。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-22-1" name="__codelineno-22-1"></a><a href="#__codelineno-22-1"><span class="linenos" data-linenos=" 1 "></span></a>server <span class="o">{</span>
<a id="__codelineno-22-2" name="__codelineno-22-2"></a><a href="#__codelineno-22-2"><span class="linenos" data-linenos=" 2 "></span></a>  server_name example.com<span class="p">;</span>
<a id="__codelineno-22-3" name="__codelineno-22-3"></a><a href="#__codelineno-22-3"><span class="linenos" data-linenos=" 3 "></span></a>  listen       <span class="m">443</span> ssl http2 default_server<span class="p">;</span>
<a id="__codelineno-22-4" name="__codelineno-22-4"></a><a href="#__codelineno-22-4"><span class="linenos" data-linenos=" 4 "></span></a>  listen       <span class="o">[</span>::<span class="o">]</span>:443 ssl http2 default_server<span class="p">;</span>
<a id="__codelineno-22-5" name="__codelineno-22-5"></a><a href="#__codelineno-22-5"><span class="linenos" data-linenos=" 5 "></span></a>
<a id="__codelineno-22-6" name="__codelineno-22-6"></a><a href="#__codelineno-22-6"><span class="linenos" data-linenos=" 6 "></span></a>  ssl_certificate /etc/nginx/cert.d/example.com.fullchain.cer<span class="p">;</span>
<a id="__codelineno-22-7" name="__codelineno-22-7"></a><a href="#__codelineno-22-7"><span class="linenos" data-linenos=" 7 "></span></a>  ssl_certificate_key /etc/nginx/cert.d/example.com.key<span class="p">;</span>
<a id="__codelineno-22-8" name="__codelineno-22-8"></a><a href="#__codelineno-22-8"><span class="linenos" data-linenos=" 8 "></span></a>  ssl_dhparam /etc/nginx/cert.d/dhparam.pem<span class="p">;</span>
<a id="__codelineno-22-9" name="__codelineno-22-9"></a><a href="#__codelineno-22-9"><span class="linenos" data-linenos=" 9 "></span></a>  ssl_protocols TLSv1 TLSv1.1 TLSv1.2<span class="p">;</span>
<a id="__codelineno-22-10" name="__codelineno-22-10"></a><a href="#__codelineno-22-10"><span class="linenos" data-linenos="10 "></span></a>  ssl_ciphers <span class="s1">&#39;[ECDHE-ECDSA-AES128-GCM-SHA256|ECDHE-ECDSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256|ECDHE-RSA-CHACHA20-POLY1305]:ECDHE+AES128:RSA+AES128:ECDHE+AES256:RSA+AES256:ECDHE+3DES:RSA+3DES&#39;</span><span class="p">;</span>
<a id="__codelineno-22-11" name="__codelineno-22-11"></a><a href="#__codelineno-22-11"><span class="linenos" data-linenos="11 "></span></a>  ssl_prefer_server_ciphers on<span class="p">;</span>
<a id="__codelineno-22-12" name="__codelineno-22-12"></a><a href="#__codelineno-22-12"><span class="linenos" data-linenos="12 "></span></a>  <span class="c1"># ...</span>
<a id="__codelineno-22-13" name="__codelineno-22-13"></a><a href="#__codelineno-22-13"><span class="linenos" data-linenos="13 "></span></a><span class="o">}</span>
</code></pre></div>
<p>ssl_dhparam /etc/nginx/cert.d/dhparam.pem; 是在 <a href="#4.生成_dhparam.pe_文件">#4.生成 dhparam.pem 文件</a> 步骤中生成的，可选。</p>
<p>ssl_ciphers用于指定加密套件，这里采用的是 CloudFlare 家的，具体也不是很清楚 emmm。可以参考一下 Mozilla 的 Wiki：Security/Server Side TLS</p>
<ul>
<li>
<p>TLSv1.3（可选）
现在很多网站都上 TLSv1.3 了，证书检测的网站对于 TLSv1、TLSv1.1 都认为不安全了，Firefox 自 74.0 版本开始也完全放弃对加密协议 TLS 1.0 和 TLS 1.1 的支持了。</p>
</li>
<li>
<p>对于 TLSv1.3 的配置，需要安装最新版的 openssl（OpenSSL 1.1.1 built with TLSv1.3或更高），而后重新编译 nginx，是有点麻烦这里懒得弄了，后面需要再折腾吧。</p>
</li>
<li>
<p>开启 HSTS（可选）
当然，为了更加安全，可以选择开启 HSTS（HTTP Strict Transport Security，HTTP严格传输安全协议），强制浏览器通过 https 进行访问。需要在 location 下的设置中加入一个 header。</p>
</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-23-1" name="__codelineno-23-1"></a><a href="#__codelineno-23-1"><span class="linenos" data-linenos="1 "></span></a>add_header Strict-Transport-Security <span class="s2">&quot;max-age=31536000; includeSubDomains; preload&quot;</span><span class="p">;</span>
</code></pre></div>
<p>接下来的一年（即31536000秒）中，浏览器看到 header 中包含 Strict-Transport-Security 的话就会自动切换到 https。</p>
<p>但是在首次访问网站时如果被劫持了，浏览器还是可能会通过 HTTP 明文传递信息。为此，Chrome 维护了一个 HSTS preload list，内置在浏览器中，对于 Chrome, Firefox, Opera, Safari, IE 11 and Edge 等主流浏览器也适用。可以在这里提交你的域名到这个列表里。（不过提交之前要考虑好，全站上 https 噢</p>
<p>如果 TLS 证书无效或不可信，用户不能忽略浏览器警告继续访问网站。这就是前几天访问 GitHub (Pages) 等网站被拦下来的原因了。</p>
<p>上面的配置完成后检查一下配置是否正确，而后重启 nginx。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-24-1" name="__codelineno-24-1"></a><a href="#__codelineno-24-1"><span class="linenos" data-linenos="1 "></span></a>nginx -t
<a id="__codelineno-24-2" name="__codelineno-24-2"></a><a href="#__codelineno-24-2"><span class="linenos" data-linenos="2 "></span></a>systemctl restart nginx
</code></pre></div>
<p>之后即可尝试一下能否通过 https 来访问网站了。</p>
<h2 id="6">6. 更新证书<a class="headerlink" href="#6" title="Permanent link">&para;</a></h2>
<p>证书的有效期为 90 天，acme.sh 默认会 60 天更新（Renew）一次。</p>
<p>在安装 acme.sh 的时候就自动配置了一条 cron 任务了，会每天检查证书的情况。当然可以到 crontab 里看一下。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-25-1" name="__codelineno-25-1"></a><a href="#__codelineno-25-1"><span class="linenos" data-linenos="1 "></span></a>crontab -l
<a id="__codelineno-25-2" name="__codelineno-25-2"></a><a href="#__codelineno-25-2"><span class="linenos" data-linenos="2 "></span></a><span class="m">50</span> <span class="m">0</span> * * * <span class="s2">&quot;/root/.acme.sh&quot;</span>/acme.sh --cron --home <span class="s2">&quot;/root/.acme.sh&quot;</span> &gt; /dev/null
<a id="__codelineno-25-3" name="__codelineno-25-3"></a><a href="#__codelineno-25-3"><span class="linenos" data-linenos="3 "></span></a><span class="c1"># 可修改为</span>
<a id="__codelineno-25-4" name="__codelineno-25-4"></a><a href="#__codelineno-25-4"><span class="linenos" data-linenos="4 "></span></a><span class="m">50</span> <span class="m">0</span> * * * <span class="s2">&quot;/root/.acme.sh&quot;</span>/acme.sh --cron --home <span class="s2">&quot;/root/.acme.sh&quot;</span> &gt;&gt;/mnt/disk1/log/acme.sh/acme.out <span class="m">2</span>&gt;<span class="p">&amp;</span><span class="m">1</span>
</code></pre></div>
<p>也可以试着用上面这条命令执行看一下相关的配置是否正确。</p>
<ul>
<li>强制续签</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-26-1" name="__codelineno-26-1"></a><a href="#__codelineno-26-1"><span class="linenos" data-linenos="1 "></span></a>acme.sh --renew -d example.com --force
<a id="__codelineno-26-2" name="__codelineno-26-2"></a><a href="#__codelineno-26-2"><span class="linenos" data-linenos="2 "></span></a>acme.sh --renew -d example.com --force --ecc  <span class="c1"># 如果用的是ECC证书</span>
</code></pre></div>
<ul>
<li>
<p>停止续签证书</p>
</li>
<li>
<p>查看证书</p>
</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-27-1" name="__codelineno-27-1"></a><a href="#__codelineno-27-1"><span class="linenos" data-linenos="1 "></span></a>acme.sh --list
</code></pre></div>
<ul>
<li>停止 Renew</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-28-1" name="__codelineno-28-1"></a><a href="#__codelineno-28-1"><span class="linenos" data-linenos="1 "></span></a>acme.sh --remove -d example.com <span class="o">[</span>--ecc<span class="o">]</span>
</code></pre></div>
<p>之后手动把目录下的证书移除就行。</p>
<p>0x08 升级 acme.sh
<div class="highlight"><pre><span></span><code><a id="__codelineno-29-1" name="__codelineno-29-1"></a><a href="#__codelineno-29-1"><span class="linenos" data-linenos="1 "></span></a>acme.sh --upgrade    <span class="c1"># 手动升级</span>
<a id="__codelineno-29-2" name="__codelineno-29-2"></a><a href="#__codelineno-29-2"><span class="linenos" data-linenos="2 "></span></a>acme.sh --upgrade --auto-upgrade    <span class="c1"># 自动升级</span>
<a id="__codelineno-29-3" name="__codelineno-29-3"></a><a href="#__codelineno-29-3"><span class="linenos" data-linenos="3 "></span></a>acme.sh --upgrade --auto-upgrade <span class="m">0</span>  <span class="c1"># 停止自动升级</span>
</code></pre></div></p>
<ul>
<li>小结</li>
</ul>
<p>除了上面这些配置之外，acme.sh 还提供了通知提醒，可以调用其他 API 来推送提醒，具体参考官方Wiki：notify。</p>
<p>总之这个工具还是很实用的，大大降低了 SSL 配置的门槛，至于整个操作过程的安全性，只能说世界上的绝对安全是不可能的，永远只有相对或更的区别，都是想方设法尽可能做到安全。</p>
<p>由于时效性可能导致部分内容不适用，可参考官网：<a href="https://github.com/acmesh-official/acme.sh">https://github.com/acmesh-official/acme.sh</a>。</p>
<h2 id="7-faq">7. FAQ<a class="headerlink" href="#7-faq" title="Permanent link">&para;</a></h2>
<ul>
<li>-</li>
</ul>
<h2 id="8">8. 相关<a class="headerlink" href="#8" title="Permanent link">&para;</a></h2>
<ul>
<li>公开免费申请泛域名证书：https://ssl.ioiox.com/</li>
</ul>

              
            </article>
          </div>
        </div>
        
      </main>
      
        <footer class="md-footer">
  
  <div class="md-footer-meta md-typeset">
    <div class="md-footer-meta__inner md-grid">
      <div class="md-copyright">
  
  
    Made with
    <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
      Material for MkDocs
    </a>
  
</div>
      
    </div>
  </div>
</footer>
      
    </div>
    <div class="md-dialog" data-md-component="dialog">
      <div class="md-dialog__inner md-typeset"></div>
    </div>
    <script id="__config" type="application/json">{"base": "../../../..", "features": ["search.suggest", "search.highlight", "navigation.tabs", "navigation.expand", "toc.follow", "toc.integrate"], "search": "../../../../assets/javascripts/workers/search.5e67fbfe.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}, "version": {"default": "latest", "provider": "mike"}}</script>
    
    
      <script src="../../../../assets/javascripts/bundle.c44cc438.min.js"></script>
      
        <script src="../../../../static/js/util.js"></script>
      
    
  </body>
</html>